#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/7/12 17:56
# @File    : canvas_bezier.py
# @Description : -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

# 参考： https://blog.51cto.com/u_16175433/8175987

import numpy as np
import matplotlib.pyplot as plt

point1 = (2, 3)  # 第一个点的坐标
point2 = (3, 1)  # 第二个点的坐标

def bezier_line(point1:tuple=None, point2: tuple=None, offset=2):
    # 贝塞尔曲线的控制点决定了曲线的形状。我们可以通过计算两个点的中点，并在中点的上方或下方添加一个偏移量来确定控制点的位置。可以使用以下代码计算控制点的坐标：
    mid_point = ((point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2)  # 两点的中点
    offset = 2  # 偏移量
    control_point = (mid_point[0], mid_point[1] + offset)  # 控制点的坐标
    # formula
    # B(t) = (1 - t)^2 * P0 + 2 * (1 - t) * t * P1 + t^2 * P2
    t = np.linspace(0, 1, 100)  # 在0到1之间均匀取100个点

    # X, y轴
    bezier_curve = (1 - t) ** 2 * point1[0] + 2 * (1 - t) * t * control_point[0] + t ** 2 * point2[0], \
                   (1 - t) ** 2 * point1[1] + 2 * (1 - t) * t * control_point[1] + t ** 2 * point2[1]  # 计算贝塞尔曲线的点
    return bezier_curve, control_point

bezier, control = bezier_line(point1, point2)


"""
    
    思路


"""


print(bezier[0])
print(bezier[1])
print(control)

plt.plot(bezier[0], bezier[1], 'r--', label='Bezier Curve')  # 绘制贝塞尔曲线
plt.scatter([point1[0], point2[0]], [point1[1], point2[1]], color='blue', label='Control Points')  # 绘制控制点
plt.scatter(control[0], control[1], color='green', label='Control Point')  # 绘制控制点
plt.legend()  # 显示图例
plt.xlabel('X')  # 设置x轴标签
plt.ylabel('Y')  # 设置y轴标签
plt.title('Bezier Curve')  # 设置图表标题
plt.grid(True)  # 显示网格线
plt.show()  # 显示图表